package cn.tedu.rabbitmq;
import com.rabbitmq.client.*;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.Bean;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 三个方法
 * 生命组件：声明一个队列
 * 生产端：发送消息
 * 消费端：监听队列消费消息
 */
public class SimpleMode {
    //初始化连接channel
    private Channel channel;
    @Before
    public void init() throws IOException, TimeoutException {
        //长简介 连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //ip port5672 user(guest) password(guest)
        factory.setHost("10.42.77.153");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        Connection connection = factory.newConnection();

        channel=connection.createChannel();
    }
    @Test
    public void declare() throws Exception {
        //声明队列，给队列起名字 同名存在 直接使用 没有则创建
        channel.queueDeclare("simple-q", //队列名字
                true,//是否吃接话true是false不是
                false,//是否专属，专属于创建这个队列的连接
                false,//是否自动删除 当最后一个消费端断开连接监听时候 自动删除
                null);//Map<String,Object> 队列属性


    }
    //  发送消息
    @Test
    public void send() throws Exception {
        String msg="你好我是原浩伟";
        channel.basicPublish("",//交换机的名字
                "simple-q",//消息携带的路由key
                null,//消息属性 basicproperties
                msg.getBytes("utf-8"));//
        System.out.println("消息发送成功");

    }
    //一个消费端监听simple-q的队列
    @Test
    public void consume() throws Exception {
        //执行监听消费逻辑的对象 如果我们接受到消息 就可以调用handle方法
        DeliverCallback deliverCallback = new DeliverCallback() {
            @Override
            public void handle(String s, Delivery delivery) throws IOException {
                //consumerTag 消费端id
                //message 接收的消息对象
                System.out.println(delivery.getEnvelope().getExchange());
                System.out.println(new String(delivery.getBody()));//消息体 byte[]
                delivery.getProperties().getPriority();
                delivery.getProperties().getUserId();
                delivery.getProperties().getClassId();
            }
        };
        channel.basicConsume("simple-q",true,deliverCallback,s->{
            //当消费端对象被删除cancle时，这个方法才调用
        });
        while (true);
    }
}
